import axios from 'axios';
import routes from '../router/index';

import store from '../store/index';
const instance = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 200000,
  headers: { 'X-Custom-Header': 'foobar' },
});

// 添加请求拦截器
instance.interceptors.request.use(
  async function (config) {
    // 在发送请求之前做些什么
    //  在发送请求之间, 干什么   先确保一下有没有token  有就携带token过去
    //  如果没有token 那就没被携带 那么是否要跳转到登陆页面
    // 如果 有token 一定存在一个有效期, 我们就需要去判断一下有效期是否过期
    //  如果过期了 重新去登陆

    //  判断对方是否是登录. 如果是登录 直接 跳转

    if (config.url == '/user/login') {
      return config;
      //  防止登录死循环
    }
    //  还要判断token 有没有过去
    //   if(config.data){
    //     for(let key in  config.data){
    //        if(  config.data[key] == "" ){
    //           delete config.data[key]
    //        }else if( JSON.stringify(config.data[key]) == "{}"){

    //         console.log("为空where",key);
    //         delete config.data[key]
    //        }
    //     }
    // }

    if (localStorage.getItem('token')) {
      //  如果有token  就顺便携带过去
      //  如何携带token过去 ?
      // 一般是携带到 请求头
      if (Date.now() / 1000 - localStorage.getItem('expiresIn') > 0) {
        //  代表 有效期已经过去 , 重新登录  还要判断一下自己能不能去重新登录
        //  我们在本地存储中存了  用户密码跟信息
        //  死循环
        //  超出了需要重新登录
        //  发送请求
        //   在js文件中   this.$store  是找不到 store  因为this 不是vue
        console.log('有效期过期重新获取');
        await store.dispatch(
          'login',
          JSON.parse(localStorage.getItem('userPD'))
        );
      }

      config.headers['authorization'] = localStorage.getItem('token');
      //  这样后端就可以获取我们发送的token  也不影响发生过去的数据校验
    }

    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
//  对后端的 code 进行判断 , 没有登录 或者是有效期已经失效 那么后端一定会返回一个 code  跟失败信息给
//  那个如果这种情况    再跳转登陆页面让用户去登录  再返回
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    //  发现后端告诉你 登录失效了 , 我们需要干什么?

    if (response.data.code == 40005) {
      //  直接跳转到登陆页面
      // 让对方点击登陆后, 重新调到之前的页面中 让她重新操作
      console.log('跳转登录');
      localStorage.removeItem('token');
      routes.push('/login');
    }

    1;
    return response.data;
  },
  function (error) {
    // 对响应错误做点什么
    localStorage.removeItem('token');
    return Promise.reject(error);
  }
);

export default instance;
